package com.sjms._12_行为_代理模式._2_动态代理;

/**
 * 代理模式
 * 在开发者的角度来看，创建一个代理对象，提供给用户使用，避免用户直接访问真正的对象
 * 在用户角度来看，就是普通的类方法调用
 * <p>
 * 作用
 * 1.保护被代理对象
 * 2.增强被代理对象
 * 3.完全替换被代理对象
 * <p>
 * 动态代理（JDK代理、接口代理、拦截器模式）
 * 动态代理中的静态方法：java.lang.reflect.Proxy.newProxyInstance (ClassLoader(类加载器),interface(接口),handler（监听处理器）)
 * <p>
 * 代码示例：《帮爸爸买菜》
 * 1.Father: 被代理类，必须需要实现接口
 * 2.Son: 代理类，不需要实现接口
 * 3.代理类，接收父亲类对象，利用反射机制，创建一个代理对象（在内存中动态创建代理对象）
 * Proxy.newProxyInstance (ClassLoader(类加载器),interface(接口),handler（监听处理器）)
 * 然后客户端通过返回的代理对象，调用目标对象。调用目标对象时，会回调 newProxyInstance 的 handler
 */
public class _Test_Mom {

    public static void main(String[] args) {
        System.out.println("妈妈：他爸!!!去买点菜");
        Tool father = new Father();

        //儿子 构建 代理爸爸
        Son son = new Son();
        son.setTarget(father);
        Tool proxyFather = (Tool) son.getProxy();

        //
        String buy = proxyFather.buy();
        System.out.println(buy);

    }

}
